package com.cskaoyan.javase.oop1._11static._4exercise;
/**
 * 读程序题
 *
 * 首先需要类加载Demo2
 * Demo2类中有静态成员变量的显式赋值
 * 但是这个显式赋值,需要创建Cat对象
 * 于是触发Cat类的类加载
 * Cat类中也存在静态成员变量的显式赋值
 * 需要创建Dog对象
 * 于是触发Dog类的类加载
 *
 * Dog类中没有static声明 类加载过程没有输出
 * Dog类虽然最后类加载,但是率先类加载完毕
 * 于是开始创建Dog对象,完成Cat类的类加载
 * 所以程序的第一行输出"dog"
 * Cat类的类加载结束后,于是开始创建Cat对象,完成Demo2类的类加载
 * 于是程序输出"cat"
 * Demo2类加载结束,于是开始启动main方法
 * 程序输出"hello world!"
 *
 * 下面又要创建Demo2对象
 * 问:还会类加载吗?
 * 不会,刚才启动main方法已经将Demo2,Dog,Cat三个类全部类加载完毕了.
 *
 * 于是直接找构造器,创建对象即可
 * 但是Demo2中还存在成员变量的显式赋值
 * 于是输出"dog"
 * 最后输出"demo2"
 *
 *
 * @since 09:46
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    // static int a = 10;
    static Cat cat = new Cat();
    Dog dog = new Dog();
    Dog dog2;

    // 启动main方法,触发该类的类加载,该类类加载完毕后,才会启动main方法
    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo2 d = new Demo2();
    }

    public Demo2() {
        System.out.println("demo2");
    }
}

class Cat {
    static Dog dog = new Dog();

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    public Dog() {
        System.out.println("dog");
    }
}
